perm filename SCANER.SAI[SYS,HE]3 blob
sn#014945 filedate 1972-11-30 generic text, type T, neo UTF8
00100 COMMENT ⊗ VALID 00010 PAGES
00200 RECORD PAGE DESCRIPTION
00300 00001 00001
00400 00003 00002 ENTRY XTENT
00500 00006 00003 ⊃ CHANGE CLIP LEVEL MAX. DIFF. AND SET CLIPS TO IT
00600 00009 00004 ⊃ DEBUGGING ROUTINES
00700 00011 00005 ⊃ INITIALIZES SENSITIVITY CONTROL
00800 00015 00006 ⊃ SET CLIP LEVELS TO JUST INCLUDE THE RANGE
00900 00017 00007 ⊃ GENERAL ACCOMODATION ROUTINE
01000 00021 00008 ⊃ ENTRY TO KEEP RASTER INTERSECTION IN BOUNDS
01100 00024 00009 ⊃ VERIFIES THAT DETECTED DISCONTINUITY BELONGS TO AN OBJECT EDGE OF
01200 00028 00010 ⊃ TEST WHETHER I2 (NEXT SCAN POINT) DIFFERS
01300 00030 ENDMK
01400 ⊗;
00100 ENTRY XTENT;
00200 BEGIN "SCNER"
00300 REQUIRE "PREAMB.SAI[SYS,HE]" SOURCE_FILE;
00400 REQUIRE "DPYSUB.HDR[SYS,HE]" SOURCE_FILE;
00500 REQUIRE 500 STRING_SPACE;
00600
00700 EXTERNAL INTEGER PROCEDURE GETPNT(INTEGER X,Y);
00800 EXTERNAL PROCEDURE INTPNT;
00900 EXTERNAL PROCEDURE TVIN;
01000 EXTERNAL INTEGER PROCEDURE GENTER(INTEGER X,Y; REFERENCE BOOLEAN O;
01100 REFERENCE INTEGER D);
01200 EXTERNAL INTEGER PROCEDURE DDACO(INTEGER DAC);
01300 EXTERNAL INTEGER PROCEDURE YOPER(INTEGER X,Y; REFERENCE INTEGER ANG;
01400 INTEGER CW; BOOLEAN TRAC,FLAG);
01500
01600 DEFINE CRLF="'15&'12",⊃="COMMENT", TVRESET="STVFL←0", SAFEX="SAFE",
01700 TVX(X)="(X)*3.0-512.0", TVY(Y)="512.0-(Y)*3.0";
01800 EXTERNAL INTEGER GTHRES, JOBNUM;
01900 EXTERNAL BOOLEAN ACCOMINIT; ⊃ RESETS STATISTICS FOR NEW SCENE;
02000 EXTERNAL INTEGER BCLIP, TCLIP, FLINE, LLINE, RSIDE, LSIDE, IND, TMAX, BMAX,
02100 LSMAX, RSMAX, STVFL, IWID, TVCAM;
02200 EXTERNAL REAL OD, OB;
02300 INTEGER INT,INT2,KKP,FRAMEX,CLIPDIF,I1, I2, CW, TRAC, X2, Y2, DIR;
02400 INTERNAL BOOLEAN SCAN_ACC, SCAN_DIR;
02500 BOOLEAN ADEB, DISSHW;
02600 SAFEX INTEGER ARRAY DISPL[1:100];
02700 SAFEX BOOLEAN ARRAY TDAC[0:63];
02800 PRELOAD_WITH 0, [3] 1, 0, [3] -1;
02900 SAFEX INTEGER ARRAY SDIRX[0:7];
03000 PRELOAD_WITH 1, 1, 0, [3] -1, 0, 1;
03100 SAFEX INTEGER ARRAY SDIRY[0:7];
03200
03300 SIMPLE PROCEDURE OUTCLIP(STRING LAB);
03400 IF TYP_EDGE THEN
03500 OUTSTR(LAB&" TCLIP="&CVS(TCLIP)&" BCLIP="&CVS(BCLIP)&CRLF);
03600
03700 ⊃ CHECK CLIP LEVEL AND ADJUST IF CHANGED;
03800
03900 SIMPLE INTERNAL PROCEDURE REINIT;
04000 IF ABS(TCLIP-BCLIP)<CLIPDIF THEN
04100 BEGIN
04200 TCLIP←(7-CLIPDIF) DIV 2;
04300 BCLIP←TCLIP+CLIPDIF;
04400 TVRESET;
04500 OUTCLIP("REINIT");
04600 END;
00100 ⊃ CHANGE CLIP LEVEL MAX. DIFF. AND SET CLIPS TO IT;
00200
00300 SIMPLE INTERNAL PROCEDURE CLIPCHG(INTEGER DIF);
00400 IF 0≤DIF≤7 THEN
00500 BEGIN
00600 CLIPDIF ← DIF;
00700 REINIT;
00800 END;
00900
01000 SIMPLE INTEGER PROCEDURE DACO(INTEGER D);
01100 IF 0<D≤62 THEN
01200 BEGIN INTEGER I;
01300 I ← DDACO(D);
01400 TDAC[D] ← FALSE;
01500 TVRESET;
01600 IF TYP_EDGE THEN
01700 OUTSTR("DAC SET AT "&CVS(D)&" AD="&CVS(I)&CRLF);
01800 RETURN(I);
01900 END;
02000
02100
02200 ⊃ VARIABLES USED FOR SENSITIVITY CONTROL
02300
02400 AUTO_ACC SETTING OF DAC AT AUTOTARGET LIMIT
02500 AUTOCAL_ACC TABLE_ACC INITIALIZED
02600 DAC_ACC CURRENT DAC SETTING
02700 SENSCAL_ACC SENSITIVITY HAS BEEN CALIBRATED
02800 SENSIGN_ACC LAST CHANGE 1 UP, -1 DOWN [NOT USED]
02900 SENSFLAG_ACC SENSITIVITY CAN BE RAISED [NOT USED]
03000 SENDWNFG_ACC SENSITIVITY CANNOT BE LOWERED [NOT USED]
03100 SCAN_ACC FALSE IF ACCOMODATION DESIRED ON INITIAL SCAN [NOT USED]
03200 SCAN_DIR DIRECTION SENSITIVITY IS ALLOWED TO CHANGE
03300 -1 DOWN, 1 UP, 0 EITHER
03400 CHANGE_ACC TRUE IF SCENE HAS CHANGED
03500 ACCOMINIT TRUE IF EDGE FOLLOWER SHOULD INIT SCANNER
03600 TABLE_ACC HOLDS AD READINGS FOR DAC SETTINGS READ, -1 FOR OTHERS
03700 ;
03800
03900 SIMPLE INTERNAL PROCEDURE ACCOON;
04000 BEGIN INTEGER I;
04100 IF DISDEV≠2 THEN OUTSTR("NO DEBUGGING ON THIS DEVICE"&CRLF) ELSE
04200 IF (FRAMEX←GETPOG)≥0 THEN DISSHW←ADEB←TRUE ELSE
04300 OUTSTR("NO FREE FRAMES - ACCOON"&CRLF);
04400 END;
04500
04600 SIMPLE INTERNAL PROCEDURE ACCOFF;
04700 BEGIN
04800 ADEB ← FALSE;
04900 RELPOG(FRAMEX);
05000 END;
00100 ⊃ DEBUGGING ROUTINES;
00200
00300 SIMPLE PROCEDURE SHOW(STRING FOO; INTEGER X1,Y1,X2,Y2);
00400 BEGIN INTEGER I, CNT, DISSAVE;
00500 DISSAVE ← DPYPARS;
00600 DPYSET(DISPL);
00700 DPYBRT(3);
00800 DPYBIG(3);
00900 SETFORMAT(3,0);
01000 AIVECT(-512,400);
01100 DPYSST(FOO&CRLF&"TCLIP="&CVS(TCLIP)&CRLF&"BCLIP="&CVS(BCLIP)&CRLF&
01200 "DAC="&CVS(DAC_ACC)&CRLF&"INT1="&CVS(I1)&CRLF&"INT2="&
01300 CVS(I2)&CRLF&"IWID="&CVS(IWID));
01400 DPYSST(CRLF&"AUTO_ACC ="&CVS(AUTO_ACC)&CRLF);
01500 DPYSST("CHANGE= "&(IF CHANGE_ACC THEN "TRUE" ELSE "FALSE"));
01600 DPYSST(CRLF&"SENS IS "&(IF ¬SENSFLAG_ACC THEN "UP" ELSE
01700 IF SENDWNFG_ACC THEN "DOWN" ELSE ""));
01800 APT(TVX(X1),TVY(Y1));
01900 APT(TVX(X2),TVY(Y2));
02000 DPYOUT(FRAMEX);
02100 DPYRESET(DISSAVE);
02200 IF CNT≤0 THEN
02300 BEGIN
02400 IF "0"≤(I←INCHRW)≤"9" THEN CNT←CNT+I-"0"
02500 END ELSE CNT←CNT-1;
02600 IF I="Y" THEN DISSHW ← TRUE;
02700 IF I="N" THEN DISSHW ← FALSE;
02800 END;
00100 ⊃ INITIALIZES SENSITIVITY CONTROL;
00200
00300 SIMPLE PROCEDURE SENSINIT;
00400 BEGIN LABEL HALF, LOUT, L2;
00500 INTEGER UDAC, LDAC, I, J, K, TST, PT, CURAD;
00600 IF ¬AUTOCAL_ACC THEN
00700 L2: BEGIN "INIT"
00800 FOR I←2 STEP 1 UNTIL 61 DO TABLE_ACC[I] ← -1;
00900 AUTO_ACC ← 60;
01000 TABLE_ACC[LDAC←62] ← DACO(LDAC);
01100 TABLE_ACC[UDAC←1] ← DACO(UDAC);
01200 IF ABS(TABLE_ACC[62]-TABLE_ACC[1])<100 THEN
01300 BEGIN
01400 OUTSTR("SENSITIVITY CONTROL IS HUNG"&CRLF&
01500 "TYPE ANY CHAR TO CONT."&CRLF);
01600 INCHWL;
01700 GO TO L2;
01800 END;
01900 AUTOCAL_ACC ← TRUE;
02000 GO TO HALF;
02100 END "INIT";
02200 TABLE_ACC[1] ← CURAD ← DACO(1);
02300 IF ABS(CURAD-(J←TABLE_ACC[AUTO_ACC]))<40 THEN GO TO LOUT;
02400 IF CURAD<J THEN
02500 BEGIN "HI"
02600 UDAC ← 1;
02700 LDAC ← AUTO_ACC;
02800 AUTO_ACC ← AUTO_ACC-1;
02900 GO TO HALF;
03000 END "HI";
03100 TST ← 10000;
03200 FOR I←62 STEP -1 UNTIL AUTO_ACC DO
03300 IF (J←TABLE_ACC[I])≥0∧(K←ABS(CURAD-J))<TST THEN
03400 BEGIN
03500 IF K<20 THEN BEGIN AUTO_ACC ← I; GO TO LOUT; END;
03600 TST ← K; PT ← I;
03700 END;
03800 J ← IF K←(TABLE_ACC[PT]>CURAD) THEN -1 ELSE 0;
03900 TST ← PT;
04000 WHILE TABLE_ACC[TST←TST+J]<0 DO;
04100 IF K THEN BEGIN LDAC←PT; UDAC←TST; END ELSE
04200 BEGIN LDAC←TST; UDAC←PT; END;
04300 IF LDAC-UDAC<2 THEN
04400 LOUT: BEGIN "OUT"
04500 SENSCAL_ACC ← TRUE;
04600 CHANGE_ACC ← FALSE;
04700 IF AUTO_ACC≠DAC_ACC THEN DACO(AUTO_ACC);
04800 OUTSTR("AUTO TARGET SET AT "&CVS(AUTO_ACC)&CRLF);
04900 RETURN;
05000 END "OUT";
05100 HALF: I ← (LDAC+UDAC) DIV 2;
05200 CURAD ← TABLE_ACC[I] ← DACO(I);
05300 IF ABS(CURAD-TABLE_ACC[UDAC])<50 THEN
05400 BEGIN "L1"
05500 UDAC ← I;
05600 IF LDAC-UDAC<2 THEN
05700 BEGIN
05800 IF CURAD-TABLE_ACC[I-1]>50 THEN DACO(AUTO_ACC←I-1)
05900 ELSE AUTO_ACC←I;
06000 GO TO LOUT;
06100 END;
06200 GO TO HALF;
06300 END "L1";
06400 LDAC ← I;
06500 AUTO_ACC ← LDAC-1;
06600 IF LDAC-UDAC<2 THEN GO TO LOUT;
06700 GO TO HALF;
06800 END;
00100 ⊃ SET CLIP LEVELS TO JUST INCLUDE THE RANGE
00200 OF INTENSITIES GIVEN;
00300
00400 SIMPLE BOOLEAN PROCEDURE CLIPSET(REFERENCE INTEGER INT, INT2);
00500 BEGIN INTEGER BIG, T, B;
00600 T←TCLIP+(BCLIP-TCLIP)*(15-(INT MAX INT2))%14;
00700 B←BCLIP-(BCLIP-TCLIP)*(INT MIN INT2)%14;
00800 IF T>B THEN
00900 BEGIN
01000 OUTSTR("CLIP LEVELS REVERSED - CLIPRANGE"&CRLF);
01100 TCLIP↔BCLIP;
01200 END;
01300 IF TCLIP=T∧BCLIP=B THEN RETURN(TRUE);
01400 TCLIP←T;BCLIP←B;TVRESET;
01500 RETURN(FALSE);
01600 END;
01700
01800 ⊃ TEST FOR RASTER SCAN FOR ACOMTEST.
01900 X2, Y2 MUST BE SET BEFORE CALLING;
02000
02100 SIMPLE BOOLEAN PROCEDURE TEST1(REFERENCE INTEGER X,Y);
02200 BEGIN INTEGER I, J;
02300 I1 ← GENTER(X, Y, J←-1,I);
02400 I2 ← GENTER(X2, Y2, J←-1,I);
02500 RETURN(ABS(I1-I2)≥GTHRES∨((I1 MIN I2)>0∧(I1 MAX I2)<15));
02600 END;
02700
02800 ⊃ TEST FOR EDGE TRACING. TRAC, CW MUST BE SET BEFORE CALLING;
02900
03000 SIMPLE BOOLEAN PROCEDURE TEST2(REFERENCE INTEGER X,Y);
03100 BEGIN
03200 INTEGER I,COH;
03300 COH ← YOPER(X, Y, DIR, CW, TRAC, I←0);
03400 I1 ← OD+.5;
03500 I2 ← OB+.5;
03600 RETURN(COH≥2);
03700 END;
03800
03900 ⊃ TEST FOR RASTER SCAN FOR FINEAC. X2, Y2 MUST BE SET BEFORE CALLING;
04000
04100 SIMPLE BOOLEAN PROCEDURE TEST3(REFERENCE INTEGER X,Y);
04200 BEGIN INTEGER I, J;
04300 I1 ← GENTER(X, Y, J←-1, I);
04400 I2 ← GENTER(X2, Y2, J←-1, I);
04500 RETURN(ABS(I1-I2)≥GTHRES);
04600 END;
00100 ⊃ GENERAL ACCOMODATION ROUTINE;
00200
00300 BOOLEAN PROCEDURE ACC(BOOLEAN CC;INTEGER MDAC, X, Y;BOOLEAN PROCEDURE TST);
00400 BEGIN
00500 INTEGER I, J, MX, MN, AD, K, BS, TS;
00600 LABEL L1, A, B, C;
00700
00800 ⊃ QUICK TEST FOR AUTOTARGET LIMIT;
00900
01000 IF (¬I1∨¬I2)∧BCLIP=7∧AUTO_ACC=DAC_ACC∧¬CHANGE_ACC∧
01100 (BCLIP-TCLIP)≤CLIPDIF THEN RETURN(FALSE);
01200
01300 ⊃ INIT LEGAL DAC TABLE;
01400
01500 TDAC[63] ← FALSE;
01600 TDAC[AUTO_ACC-1] ← FALSE;
01700 TDAC[AUTO_ACC] ← TRUE;
01800 ARRBLT(TDAC[AUTO_ACC+1],TDAC[AUTO_ACC],62-AUTO_ACC);
01900 BS ← BCLIP;
02000 TS ← TCLIP;
02100 IF BCLIP<7∨TCLIP THEN
02200 BEGIN
02300 BCLIP ← 7;
02400 TCLIP ← 0;
02500 TVRESET;
02600 END;
02700
02800 ⊃ ADJUST DAC AS NECESSARY AND POSSIBLE;
02900
03000 L1: IF TST(X,Y) THEN GO TO B;
03100 MN ← I1 MIN I2;
03200 MX ← I1 MAX I2;
03300 IF MX>15 THEN
03400 BEGIN
03500 OUTSTR("INT TOO LARGE"&CRLF);
03600 MX←15;
03700 IF I1>15 THEN I1←15 ELSE I2←15;
03800 END;
03900 IF MN<0 THEN
04000 BEGIN
04100 OUTSTR("INT TOO SMALL"&CRLF);
04200 MX←0;
04300 IF I1<0 THEN I1←0 ELSE I2←0;
04400 END;
04500 IF (¬MN∧MX=15)∨(MN>0∧MX<15)∨(MX-MN)>GTHRES∨TVCAM≠1 THEN GO TO A;
04600 IF MN THEN
04700 BEGIN "MN"
04800 FOR I←1 STEP 1 UNTIL MDAC+1 DO
04900 IF ¬TDAC[DAC_ACC+I] THEN DONE;
05000 I ← I-1;
05100 IF ¬I THEN GO TO A;
05200 J ← DAC_ACC;
05300 TABLE_ACC[DAC_ACC+I] ← DACO(DAC_ACC+I);
05400 IF ADEB THEN SHOW("DOWN",X,Y,X2,Y2);
05500 GO TO L1;
05600 END "MN";
05700 AD ← 0;
05800 FOR I←1 STEP 1 UNTIL MDAC+1 DO IF ¬TDAC[DAC_ACC-I] THEN DONE;
05900 I ← I-1;
06000 IF ¬I THEN
06100 BEGIN
06200 IF (DAC_ACC-1>AUTO_ACC)∨¬CHANGE_ACC THEN GO TO A;
06300 I ← MDAC ← 1;
06400 TABLE_ACC[DAC_ACC] ← AD ← DDACO(-1);
06500 END;
06600 J ← DAC_ACC;
06700 I ← TABLE_ACC[DAC_ACC-I] ← DACO(DAC_ACC-I);
06800 IF ADEB THEN SHOW("UP",X,Y,X2,Y2);
06900 IF AD THEN
07000 BEGIN "AD"
07100 IF ABS(AD-I)<10 THEN
07200 BEGIN
07300 DAC_ACC ← J;
07400 CHANGE_ACC ← FALSE;
07500 GO TO A;
07600 END;
07700 TDAC[AUTO_ACC←DAC_ACC] ← TRUE;
07800 TDAC[AUTO_ACC-1] ← FALSE;
07900 END "AD";
08000 GO TO L1;
08100
08200 ⊃ ADJUST CLIPS FOR PROPER OUTPUT;
08300
08400 A: IF I1>15 THEN BEGIN OUTSTR("I1 TOO LARGE"&CRLF);I1←15;END;
08500 IF I2>15 THEN BEGIN OUTSTR("I2 TOO LARGE"&CRLF);I2←15;END;
08600 IF I1<0 THEN BEGIN OUTSTR("I1 TOO SMALL"&CRLF);I1←0;END;
08700 IF I2<0 THEN BEGIN OUTSTR("I2 TOO SMALL"&CRLF);I2←0;END;
08800 IF CLIPSET(I1, I2) THEN GO TO C;
08900 IF TST(X,Y) THEN
09000 B: AD ← TRUE ELSE
09100 BEGIN
09200 IF TCLIP≠BCLIP THEN GO TO A;
09300 C: AD ← FALSE;
09400 END;
09500 IF BS≠BCLIP∨TS≠TCLIP THEN OUTCLIP("ACC") ELSE
09600 OUTSTR("CLIPS RETAINED"&CRLF);
09700 RETURN(AD);
09800 END;
00100 ⊃ ENTRY TO KEEP RASTER INTERSECTION IN BOUNDS;
00200
00300 SIMPLE INTERNAL BOOLEAN PROCEDURE ACOMTEST(REFERENCE INTEGER INT, INT2;
00400 INTEGER X,Y,LX,LY);
00500 BEGIN INTEGER A, B, C, TST;
00600 A ← TCLIP;
00700 B ← BCLIP;
00800 C ← DAC_ACC;
00900 X2 ← LX;
01000 Y2 ← LY;
01100 I1 ← INT;
01200 I2 ← INT2;
01300 ACC(TRUE,3,X,Y,TEST1);
01400 INT ← I1;
01500 INT2 ← I2;
01600 IF BCLIP-TCLIP<CLIPDIF THEN
01700 BEGIN
01800 TCLIP ← (TCLIP+BCLIP+CLIPDIF) DIV 2;
01900 BCLIP ← TCLIP+CLIPDIF;
02000 IF BCLIP>7 THEN BEGIN BCLIP←7;TCLIP←7-CLIPDIF;END;
02100 IF TCLIP<0 THEN BEGIN TCLIP←0;BCLIP←CLIPDIF;END;
02200 END;
02300 IF (TST ← A≠TCLIP∨B≠BCLIP∨C≠DAC_ACC) THEN OUTCLIP("ACOMTEST");
02400 RETURN(TST);
02500 END;
02600
02700 ⊃ ENTRY TO ACCOMODATE WHEN AN EDGE IS LOST DURING A RASTER SCAN;
02800
02900 SIMPLE INTERNAL BOOLEAN PROCEDURE FINEAC(INTEGER X1,Y1,X,Y,INT,INT2);
03000 BEGIN
03100 X2 ← X;
03200 Y2 ← Y;
03300 I1 ← INT;
03400 I2 ← INT2;
03500 RETURN(ACC(FALSE,3,X1,Y1,TEST3));
03600 END;
03700
03800 ⊃ ENTRY TO ACCOMODATE WHEN AN EDGE IS LOST WHILE TRACING;
03900
04000 SIMPLE INTERNAL BOOLEAN PROCEDURE ACCOMO(INTEGER X,Y;
04100 REFERENCE INTEGER ANGLE,CWX);
04200 BEGIN BOOLEAN T;
04300 TRAC ← TRUE;
04400 X2 ← X;
04500 Y2 ← Y;
04600 CW ← CWX;
04700 I1 ← OB+.5;
04800 I2 ← OD+.5;
04900 T ← ACC(FALSE,5,X,Y,TEST2);
05000 ANGLE ← DIR;
05100 RETURN(T);
05200 END;
00100 ⊃ VERIFIES THAT DETECTED DISCONTINUITY BELONGS TO AN OBJECT EDGE OF
00200 SUFFICIENT EXTENT THAT ATLEAST 14 POINTS IN A 4*4 RECT. WHOSE UPPER
00300 OR LOWER LEFT HAND CORNER IS THE FIRST POINT THAT DIFFERED FROM THE
00400 BACKGROUND ALSO DIFFER FROM THE BACKGROUND BY AT LEAST AS MUCH. XINCR
00500 IS SIGNED INCREMENT IN X DIRECTION, SIGFLAG IS TRUE IF OBJECT(2ND
00600 SAMPLE IN DIRECTION OF SCAN) IS BRIGHTER THAN BACKGROUND;
00700
00800 DEFINE RSET(X)="BEGIN IF TST THEN
00900 BEGIN
01000 FLINE←XT;
01100 LLINE←XB;
01200 LSIDE←XL;
01300 RSIDE←XR;
01400 TVIN;
01500 END;
01600 RETURN(X);
01700 END";
01800
01900 SIMPLE INTERNAL BOOLEAN PROCEDURE XTENT(INTEGER X,Y,XINCR; BOOLEAN SIGFLAG);
02000 BEGIN "XTNT"
02100 INTEGER K,L,COUNT1,COUNT2, STEPX,T,B,LL,R,XT,XB,XL,XR,TST,
02200 SIDER,SIDEL,LINEF,LINEL,ND,INC;
02300 XT←FLINE; XB←LLINE; XL←LSIDE; XR←RSIDE;
02400 TST←FALSE;
02500 STEPX ← IF SIGFLAG THEN 1 ELSE -1;
02600 B←LINEL←(BMAX-1) MIN (Y+4);
02700 T←LINEF←(Y-4) MAX (TMAX+1);
02800 IF XINCR>0 THEN
02900 BEGIN
03000 INC←1;
03100 LL←SIDEL←(LSMAX+1) MAX (X-XINCR-3);
03200 R←SIDER←(RSMAX-1) MIN (X+3);
03300 END ELSE BEGIN
03400 INC←-1;
03500 R←SIDEL←(RSMAX-1)MIN (X-XINCR+3);
03600 LL←SIDER←(LSMAX+1) MAX (X-3);
03700 END;
03800 COUNT1←COUNT2←INT2←INT←0;
03900 IF B>LLINE∨T<FLINE∨LL<LSIDE∨R>RSIDE THEN
04000 BEGIN
04100 LLINE←B;
04200 FLINE←T;
04300 LSIDE←LL;
04400 RSIDE←R;
04500 TVIN;
04600 TST←TRUE;
04700 INTPNT;
04800 END;
04900 LINEL←LINEL-FLINE;
05000 LINEF←LINEF-FLINE;
05100 SIDEL←SIDEL-LSIDE;
05200 SIDER←SIDER-LSIDE;
05300 ND←SIDEL+INC*3;
05400 FOR K←SIDEL STEP INC UNTIL ND DO
05500 BEGIN
05600 FOR L←LINEF STEP 1 UNTIL LINEF+3 DO
05700 BEGIN
05800 INT←INT+GETPNT(K,L);
05900 COUNT1 ← COUNT1+1;
06000 END;
06100 FOR L←LINEF+5 STEP 1 UNTIL LINEL DO
06200 BEGIN
06300 INT2←INT2+GETPNT(K,L);
06400 COUNT2 ← COUNT2+1;
06500 END;
06600 END;
06700 INT ← INT/COUNT1+.5;
06800 INT2←INT2/COUNT2+.5;
06900 INT ← IF SIGFLAG THEN INT MIN INT2 ELSE INT MAX INT2;
07000 ND←SIDER-INC*3;
07100 COUNT2 ← COUNT1←0;
07200 FOR K←ND STEP INC UNTIL SIDER DO
07300 FOR L←LINEF STEP 1 UNTIL LINEF+3 DO
07400 BEGIN "XT2"
07500 INT2←GETPNT(K,L);
07600 IF ABS(INT2-INT)≥GTHRES THEN COUNT1 ← COUNT1+1;
07700 COUNT2 ← COUNT2+1;
07800 END "XT2";
07900 IF COUNT2-COUNT1<GTHRES THEN RSET(TRUE);
08000 COUNT1 ← COUNT2←0;
08100 FOR K←ND STEP INC UNTIL SIDER DO
08200 FOR L←LINEF+5 STEP 1 UNTIL LINEL DO
08300 BEGIN "XT5"
08400 INT2←GETPNT(K,L) ;
08500 IF ABS(INT2-INT)≥GTHRES THEN COUNT2 ← COUNT2+1;
08600 COUNT1 ← COUNT1+1;
08700 END "XT5";
08800 RSET(COUNT1-COUNT2<3);
08900 END "XTNT";
00100 ⊃ TEST WHETHER I2 (NEXT SCAN POINT) DIFFERS
00200 IN THE RIGHT WAY FROM I1 TO AN EXTENT SUFFICIENT
00300 TO CONSTITUTE A POSSIBLE EDGE;
00400
00500 SIMPLE INTERNAL BOOLEAN PROCEDURE DISCON(INTEGER II1,II2,X1,Y1,X2,Y2);
00600 BEGIN "DISCO"
00700 I1←II1;
00800 I2←II2;
00900 IF ADEB∧DISSHW THEN SHOW("DISCON",X1,Y1,X2,Y2);
01000 RETURN(ABS(I2-I1)≥GTHRES);
01100 END "DISCO";
01200
01300 ⊃ CALLED AT START OF RUN;
01400
01500 SIMPLE INTERNAL INTEGER PROCEDURE SCANINIT;
01600 BEGIN "INIT"
01700 IF TVCAM=1 THEN
01800 BEGIN "ACCOM"
01900 IF DAC_ACC<0 THEN DACO(-DAC_ACC);
02000 SCAN_DIR ← 0;
02100 IF (¬SENSCAL_ACC∨CHANGE_ACC) THEN SENSINIT;
02200 END "ACCOM" ELSE BEGIN
02300 CHANGE_ACC←FALSE;
02400 SENSCAL_ACC←TRUE;
02500 DAC_ACC←AUTO_ACC←30;
02600 END;
02700 TCLIP ← BCLIP ← 5;
02800 CLIPCHG(1);
02900 END "INIT";
03000 END "SCNER";